<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>面试题-如何检测数据类型？</title>
</head>

<body>

  <script>
    // 数据类型:
    // 基本类型 string,number,boolean,null,undefined。
    // 引用类型 object【arr,{}】,fn()

    //1.typeof有问题	
    var arr = [];
    var json = {};
    console.log(typeof arr, typeof json, typeof null) //object 


    //如何检测是否是数组?
    // var arr = [];
    // console.log(typeof arr); // object;   1. typeof对于基本数据类型判断是没有问题的，但是遇到引用数据类型（如对象{},[]）返回都是object类型
    // console.log(Array.isArray(arr));  // true

    //2.检测对象的原型链是否指向构造函数的prototype对象  ,instaceof 返回的是布尔值
    console.log(arr instanceof Array); // true
    console.log(29, arr instanceof Object); // true
    console.log(arr.constructor === Array); // true

    //问题1-如果检测祖辈对象，也会出问题
    /*  
     console.log(arr instanceof Object);//true
     var json={};
     console.log(json instanceof Object) //true
   */

    //问题2-如果涉及到继承它本身的构造函数会被改变
    function Fn() { };
    Fn.prototype = new Array();
    var f = new Fn();
    console.log(f.constructor === Fn);//false
    console.log(f.constructor === Array);//true

    //   基本数据类型的构造函数String,Number,Boolean,Null,Undefined 引用数据类型:Array,Function,Object
    //3.检测构造函数的constructor属性
    console.log(47, ("1").constructor === String);
    console.log((1).constructor === Number);
    console.log((true).constructor === Boolean);
    //null,undefined 是js设计的一个败笔，暂不用考虑
    // console.log((null).constructor === Null); 
    // console.log((undefined).constructor === Undefined);
    console.log(53, ([]).constructor === Array);
    console.log((function () { }).constructor === Function);
    console.log(55, ({}).constructor === Object);

    //4.终极方法- Object.prototype.toString.call([])从原型里改变对象的指向数组 ,返回字符串 '[object Array]''
    var a = Object.prototype.toString;//jQuery源码里实际上就是采用这个方法进行数据类型检测的。
    console.log(60, a.call([])) //检测数组,返回字符串 [object Array]。检测什么类型传什么基本类型,返回的是不同 '[object 类型]'
    if (a.call({}) === '[object Array]') {
      console.log('是数组')
    }
    else {
      console.log('不是数组')
    }

  //面试题2-js的基本数据类型有哪些，检测方式?
  // https://www.cnblogs.com/zt123123/p/7623409.html

  </script>
</body>

</html>